perm filename PIXNIC.SAI[VIS,HPM]4 blob sn#144762 filedate 1975-02-11 generic text, type C, neo UTF8
COMMENT ⊗   VALID 00002 PAGES
C REC  PAGE   DESCRIPTION
C00001 00001
C00002 00002	REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE
C00013 ENDMK
C⊗;
REQUIRE "PIXSUB.REL[VIS,HPM]" LOAD_MODULE;
REQUIRE "TVSIX.REL[1,PDQ]" LOAD_MODULE;
EXTERNAL PROCEDURE MAKTAB(REFERENCE INTEGER PICTURE);
EXTERNAL INTEGER PROCEDURE PIXEL(REFERENCE INTEGER PIX; INTEGER I,J);
EXTERNAL PROCEDURE PUTEL(REFERENCE INTEGER PIX; INTEGER I,J,VALUE);

INTEGER PROCEDURE PFLDIM(STRING FILNAM);
  comment  returns the size of the picture FILNAM on disk.
		used for allocating arrays in preparation for
		actually reading them. Returns 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER ARRAY BUF[0:'177];
 OPEN(10,"DSK",'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,FILNAM,XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  ARRYIN(10,BUF[0],'200); CLOSE(10);
  IF BUF[0]≠-1 ∨ BUF[7]=0 THEN RETURN(0);
  BYBI←BUF[1];
  LNBY←BUF[6]-BUF[5]+1;
  PCLN←BUF[4]-BUF[3]+1;
  LNWD←BUF[2];
  LNBYA←LNWD*(36%BYBI);
  PCWD←LNWD*PCLN;
  XXPICLOC←(BUF[7] LAND '777777)-'200;
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;

INTEGER PROCEDURE GETPFL(STRING FILNAM; REFERENCE INTEGER PICTURE);
  comment  read the picture in file FILNAM into area of core whose first
		word is PICTURE. PFLDIM(FILNAM) words are needed.
		Returns picture size of success, 0 on failure.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];
 OPEN(10,"DSK",'10,2,0,XXCOUNT,XXBRCHAR,XXEOF);
 LOOKUP(10,FILNAM,XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  ARRYIN(10,BUF[0],'200);
  IF BUF[0]≠-1 ∨ BUF[7]=0 THEN RETURN(0);
  L←LOCATION(PICTURE);
  MEMORY[L+9]←BYBI←BUF[1];
  MEMORY[L+5]←LNBY←BUF[6]-BUF[5]+1;
  MEMORY[L+0]←PCLN←BUF[4]-BUF[3]+1;
  MEMORY[L+4]←LNWD←BUF[2];
  MEMORY[L+7]←WDBY←36%BYBI;
  MEMORY[L+6]←LNBYA←LNWD*WDBY;
  MEMORY[L+1]←PCWD←PCLN*LNWD;
  MEMORY[L+2]←PCBY←PCLN*LNBY;
  MEMORY[L+3]←PCBYA←PCLN*LNBYA;
  MEMORY[L+8]←WDBI←WDBY*BYBI;
  MEMORY[L+10]←12+PCLN+L;
  MAKTAB(PICTURE);
  XXPICLOC←(BUF[7] LAND '777777)-'200;
  FOR I←1 STEP 1 UNTIL XXPICLOC DO WORDIN(10);
  ARRYIN(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE PIXDIM(INTEGER HEIGHT,WIDTH,BITS);
  comment  returns the size of the array needed to hold a hypothetical
		picture HEIGHT scanlines by WIDTH pixels per scanline
		by BITS bits per pixel.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 BYBI←BITS;
 LNBY←WIDTH;
 PCLN←HEIGHT;
 WDBY←36%BYBI;
 LNWD←(LNBY+WDBY-1)%WDBY;
 LNBYA←LNWD*WDBY;
 PCWD←PCLN*LNWD;
 RETURN(12+PCLN+LNBYA+PCWD);
 END;

INTEGER PROCEDURE MAKPIX(INTEGER HEIGHT,WIDTH,BITS; REFERENCE INTEGER PICTURE);
  comment  actually creates an empty picture HEIGHT by WIDTH by BITS in
		the area of core beginning with PICTURE. Returns its size.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 L←LOCATION(PICTURE);
 MEMORY[L+9]←BYBI←BITS;
 MEMORY[L+5]←LNBY←WIDTH;
 MEMORY[L+0]←PCLN←HEIGHT;
 MEMORY[L+7]←WDBY←36%BYBI;
 MEMORY[L+4]←LNWD←(LNBY+WDBY-1)%WDBY;
 MEMORY[L+6]←LNBYA←LNWD*WDBY;
 MEMORY[L+1]←PCWD←PCLN*LNWD;
 MEMORY[L+2]←PCBY←PCLN*LNBY;
 MEMORY[L+3]←PCBYA←PCLN*LNBYA;
 MEMORY[L+8]←WDBI←WDBY*BYBI;
 MEMORY[L+10]←12+PCLN+L;
 MAKTAB(PICTURE);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;
 
INTEGER PROCEDURE PUTPFL(REFERENCE INTEGER PICTURE; STRING FILNAM);
  comment  write out the picture in the core area starting with
		PICTURE, creating a file called FILNAM. Returns
		the size of the original file on success, else 0.;
 BEGIN
 INTEGER XXCOUNT,XXBRCHAR,XXEOF,XXPICLOC; BOOLEAN XXFLAG;
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER I,L;
 INTEGER ARRAY BUF[0:'177];
 OPEN(10,"DSK",'10,0,2,XXCOUNT,XXBRCHAR,XXEOF);
 ENTER(10,FILNAM,XXFLAG);
 IF XXFLAG THEN
  BEGIN
  CLOSE(10);
  RETURN(0);
  END
 ELSE
  BEGIN
  L←LOCATION(PICTURE);
  BUF[0]←-1;
  BUF[1]←BYBI←MEMORY[L+9];
  BUF[2]←LNWD←MEMORY[L+4];
  BUF[3]←1; BUF[4]←PCLN←MEMORY[L+0];
  BUF[5]←1; BUF[6]←LNBY←MEMORY[L+5];
  BUF[7]←((-(PCWD←MEMORY[L+1])) LSH 18) LOR '200;
  WDBY←36%BYBI;
  LNWD←(LNBY+WDBY-1)%WDBY;
  LNBYA←LNWD*WDBY;
  ARRYOUT(10,BUF[0],'200);
  ARRYOUT(10,MEMORY[L+12+PCLN+LNBYA],PCWD);
  CLOSE(10);
  RETURN(12+PCLN+LNBYA+PCWD);
  END;
 END;


INTEGER PROCEDURE CAMPIX(INTEGER CAM,XEDGE,YEDGE,SUMS,CLPINC;
					REFERENCE INTEGER PICTURE);
  comment  read a picture from camera CAM of size defined by array PICTURE
		the area of core beginning with PICTURE. Upper left hand
		corner is at PICX,PICY. SUMS and CLPINC are averaging params.;
 BEGIN
 INTEGER PCLN,PCWD,PCBY,PCBYA,LNWD,LNBY,LNBYA,WDBY,WDBI,BYBI;
 INTEGER L;
 INTEGER ARRAY PIC[0:15];
 EXTERNAL PROCEDURE TVSIX(INTEGER ARRAY PARS; INTEGER SUMS,CLPINC);
 EXTERNAL PROCEDURE PICREL(INTEGER ARRAY PIC);
 EXTERNAL INTEGER ERROR,TVCAM;
 DEFINE SCALEX="0",SCALEY="1",POSX="2",POSY="3",SIZEX="4",SIZEY="5",
	SIZEL="6",PTR="7",NAME="8",BIT="9",GAIN="10",OFFSET="11";
	comment  for interfacing quam internal format;

 PIC[POSX]←XEDGE; PIC[POSY]←YEDGE;
 L←LOCATION(PICTURE);
 PIC[BIT]←MEMORY[L+9];
 PIC[SIZEX]←MEMORY[L+5];
 PIC[SIZEY]←PCLN←MEMORY[L+0];
 PIC[SIZEL]←MEMORY[L+4];
 PCWD←MEMORY[L+1];
 LNBYA←MEMORY[L+6];
 ERROR←1; TVCAM←CAM;
 TVSIX(PIC,SUMS,CLPINC);
 ARRBLT(MEMORY[MEMORY[L+11]],MEMORY[PIC[PTR] LAND '777777],PCWD);
 PICREL(PIC);
 RETURN(12+PCLN+LNBYA+PCWD);
 END;



DEFINE PCLN=0;  comment index of word in a picture file containing
			number of scanlines in the picture.
DEFINE PCWD=1;	comment number of words in the picture;
DEFINE PCBY=2;	comment number of valid bytes in the picture;
DEFINE PCBYA=3;	comment no. of bytes including the nulls at the end of lines;
DEFINE LNWD=4;	comment no. of words per scanline;
DEFINE LNBY=5;	comment no. of valid bytes per scanline;
DEFINE LNBYA=6;	comment no. of bytes per scanline, including the nulls;
DEFINE WDBY=7;	comment no. of bytes per word;
DEFINE WDBI=8;	comment no. of bits containing data in a word;
DEFINE BYBI=9;	comment no. of bits per byte;
DEFINE BPTAB=10; comment address of second entry in byte pntr. table;
DEFINE LINTAB=11; comment actual address of the first entry in the row table;